package bosque.unc.simulador;

import java.awt.Color;
import java.util.logging.Level;

import bosque.unc.Funciones;
import bosque.unc.enumerations.Direccion;
import bosque.unc.enumerations.EncoderNombre;
import bosque.unc.enumerations.EncoderRango;
import bosque.unc.enumerations.Sensor;

public class Updater extends Thread
{
	private Simulador simulator;
	//Latches latches;
	private int valR, valS; 
	Character segAlfa;
	Integer segAlfaInt = 0;
	Integer minAlfaInt = 0;
	Integer gradUnidDecAlfaInt = 0;
	Integer gradCenSignAlfaInt = 0;
	
	Integer segDeltaInt = 0;
	Integer minDeltaInt = 0;
	Integer gradUnidDecDeltaInt = 0;
	Integer gradCenSignDeltaInt = 0;

	
	public Updater(Simulador s)
	{
		this.simulator = s;
		
	}
	
	public void run()
	{
		
		while(true)
		{
		
		//simulator.setPaneVelLenta((simulator.getScoba().getCupula().isVelLenta()));
		simulator.setPaneOnOff(simulator.getPaneVelLenta(),(simulator.getScoba().getCupula().isVelLenta()));
		simulator.setPaneOnOff(simulator.getPaneCupIzq(),   (simulator.getScoba().getCupula().getDireccion() == Direccion.IZQUIERDA));
		simulator.setPaneOnOff(simulator.getPaneCupDer(),   (simulator.getScoba().getCupula().getDireccion() == Direccion.DERECHA));
		simulator.setPaneOnOff(simulator.getPanePlatAf(),   (simulator.getScoba().getPlataforma().getDireccion() == Direccion.AFUERA));
		simulator.setPaneOnOff(simulator.getPanePlatAd(),   (simulator.getScoba().getPlataforma().getDireccion() == Direccion.ADENTRO));
		simulator.setPaneOnOff(simulator.getPanePlatAb(),   (simulator.getScoba().getPlataforma().getDireccion() == Direccion.ABAJO));
		simulator.setPaneOnOff(simulator.getPanePlatArr(),  (simulator.getScoba().getPlataforma().getDireccion() == Direccion.ARRIBA));
//		
//		//simulator.setPaneOnOff(sicba,  latches.getBitFromAddr("789", 0));
		simulator.setPaneOnOff(simulator.getPaneTelEste(),  (simulator.getScoba().getTelescopio().getDireccion() == Direccion.ESTE));
		simulator.setPaneOnOff(simulator.getPaneTelRE(),  (simulator.getScoba().getTelescopio().getDireccion() == Direccion.ESTE));
		simulator.setPaneOnOff(simulator.getPaneTelOeste(),  (simulator.getScoba().getTelescopio().getDireccion() == Direccion.OESTE));
		simulator.setPaneOnOff(simulator.getPaneTelRO(),  (simulator.getScoba().getTelescopio().getDireccion() == Direccion.OESTE));
//		simulator.setPaneOnOff(simulator.getPaneTelDeclin(),  latches.getBitFromAddr("789", 2));
		simulator.setPaneOnOff(simulator.getPaneTelNor(),  (simulator.getScoba().getTelescopio().getDireccion() == Direccion.NORTE)); //norte
		simulator.setPaneOnOff(simulator.getPaneTelSur(),  (simulator.getScoba().getTelescopio().getDireccion() == Direccion.SUR)); //sur
		simulator.setPaneOnOff(simulator.getPaneConsRampa(),  (simulator.getScoba().getTelescopio().isConmutRampa()));
//		simulator.setPaneOnOff(simulator.getPaneHabEO(),  latches.getBitFromAddr("789", 0));
//		simulator.setPaneOnOff(simulator.getPaneHabNS(),  latches.getBitFromAddr("789", 4));
//		
//				
		simulator.setPaneOnOff(simulator.getPaneTelCalado(),  (simulator.getScoba().getTelescopio().isCalado())); //calado
		simulator.setPaneOnOff(simulator.getPaneTelGuiado(),  !(simulator.getScoba().getTelescopio().isCalado())); //guiado
//		
//		
		simulator.setPaneOnOff(simulator.getPaneInterfaz0(),  simulator.getScoba().getConsola().isInterfaz0());
		simulator.setPaneOnOff(simulator.getPaneInterfaz1(),  simulator.getScoba().getConsola().isInterfaz1());
		simulator.setPaneOnOff(simulator.getPaneSecAleja(),   simulator.getScoba().getEspejoSecundario().getDireccion() == Direccion.AFUERA);
		simulator.setPaneOnOff(simulator.getPaneSecAcerca(),  simulator.getScoba().getEspejoSecundario().getDireccion() == Direccion.ADENTRO);
		simulator.setPaneOnOff(simulator.getPaneTablero(),    simulator.getScoba().getConsola().isTablero());
		simulator.setPaneOnOff(simulator.getPaneReloj(),      simulator.getScoba().getTelescopio().isRelojeria());
		simulator.setPaneOnOff(simulator.getPanePulsador(),   simulator.getScoba().getConsola().isPulsador());
//		
//		//espectrografo
//		simulator.setPaneOnOff(simulator.getPaneEspecObtur(),   latches.getBitFromAddr("795", 5));
//		simulator.setPaneOnOff(simulator.getPaneEspecRanura(),   latches.getBitFromAddr("795", 4));
//		simulator.setPaneOnOff(simulator.getPaneEspecEjeYmas(),   latches.getBitFromAddr("795", 0));
//		simulator.setPaneOnOff(simulator.getPaneEspecEjeYmenos(),   latches.getBitFromAddr("795", 1));
//		simulator.setPaneOnOff(simulator.getPaneEspecEjeXmenos(),   latches.getBitFromAddr("795", 3));
		
		simulator.setPaneOnOff(simulator.getPaneEspecEjeYmas(),   	simulator.getScoba().getEspectrografo().getDireccionCCD() == Direccion.ARRIBA);
		simulator.setPaneOnOff(simulator.getPaneEspecEjeYmenos(),   simulator.getScoba().getEspectrografo().getDireccionCCD() == Direccion.ABAJO);
		simulator.setPaneOnOff(simulator.getPaneEspecEjeXmas(),   	simulator.getScoba().getEspectrografo().getDireccionCCD() == Direccion.DERECHA);
		simulator.setPaneOnOff(simulator.getPaneEspecEjeXmenos(),   simulator.getScoba().getEspectrografo().getDireccionCCD() == Direccion.IZQUIERDA);
		simulator.setPaneOnOff(simulator.getPaneEspecObtur(),   	simulator.getScoba().getEspectrografo().isObturador());
		simulator.setPaneOnOff(simulator.getPaneEspecContinuo(),  	simulator.getScoba().getEspectrografo().isLamparaTungs());
		simulator.setPaneOnOff(simulator.getPaneEspecCompar(),   	simulator.getScoba().getEspectrografo().isLamparaHNA());
		simulator.setPaneOnOff(simulator.getPaneEspecRedmas(),   	simulator.getScoba().getEspectrografo().getDireccionRed() ==Direccion.ARRIBA);
		simulator.setPaneOnOff(simulator.getPaneEspecRedmenos(),  	simulator.getScoba().getEspectrografo().getDireccionRed() == Direccion.ABAJO);
		simulator.setPaneOnOff(simulator.getPaneEspecFiltro1(),   	simulator.getScoba().getEspectrografo().isFiltroBit0());
		simulator.setPaneOnOff(simulator.getPaneEspecFiltro2(),   	simulator.getScoba().getEspectrografo().isFiltroBit1());
		simulator.setPaneOnOff(simulator.getPaneEspecEntFiltro(),   simulator.getScoba().getEspectrografo().isFiltroEnter());
		simulator.setPaneOnOff(simulator.getPaneEspecLed(),         simulator.getScoba().getEspectrografo().isLamparaLed());
		simulator.setPaneOnOff(simulator.getPaneEspecRanura(),      simulator.getScoba().getEspectrografo().isRanura());
		
		
		// DESHABILITAR LOS TEXTFIELDS CUANDO SE MUEVE CUPULA O PLATAFORMA
		if(simulator.getScoba().getCupula().getDireccion() == Direccion.PARADO)
		{
			simulator.getTextCupula().setEditable(true);
		}
		else
		{
			simulator.getTextCupula().setEditable(false);
		}
		
		if(simulator.getScoba().getPlataforma().getDireccion() == Direccion.PARADO)
		{
			simulator.getTextPlatARAB().setEditable(true);
			simulator.getTextPlatADAF().setEditable(true);
		}
		else
		{
			simulator.getTextPlatARAB().setEditable(false);
			simulator.getTextPlatADAF().setEditable(false);
		}
		
		
//		
//		simulator.setPaneOnOff(simulator.getPaneEspecContinuo(),   latches.getBitFromAddr("799", 0));
//		simulator.setPaneOnOff(simulator.getPaneEspecCompar(),   latches.getBitFromAddr("799", 1));
//		simulator.setPaneOnOff(simulator.getPaneEspecLed(),   latches.getBitFromAddr("799", 2));
//		simulator.setPaneOnOff(simulator.getPaneEspecRedmas(),   latches.getBitFromAddr("799", 3));
//		simulator.setPaneOnOff(simulator.getPaneEspecRedmenos(),   latches.getBitFromAddr("799", 4));
//		simulator.setPaneOnOff(simulator.getPaneEspecFiltro1(),   latches.getBitFromAddr("799", 5));
//		simulator.setPaneOnOff(simulator.getPaneEspecFiltro2(),   latches.getBitFromAddr("799", 6));
//		simulator.setPaneOnOff(simulator.getPaneEspecEntFiltro(),   latches.getBitFromAddr("799", 7));




		
		simulator.getTextFieldVelTel().setText(simulator.getScoba().getTelescopio().getVelMov().toString());
		
		try 
		{
			Integer tempAlfaGra;
			Integer tempDeltaGra;
			Integer tempAlfaSig;
			Integer tempDeltaSig;
			//segAlfaInt = Integer.parseInt(simulator.getTextAlfaSeg().getText(),16);
			//minAlfaInt = Integer.parseInt(simulator.getTextAlfaMin().getText(),16);
			//tempAlfaGra = Integer.parseInt(simulator.getTextAlfaGrad().getText(),16);
			//tempAlfaSig = (simulator.getTextAlfaSign().getText().equals("-")) ? 0x00 : 0x10;
			tempAlfaGra = Funciones.int2bcd(simulator.getEncoderAlfa().getGrados());
			segAlfaInt  = Funciones.int2bcd(simulator.getEncoderAlfa().getSegundos());
		    minAlfaInt  = Funciones.int2bcd(simulator.getEncoderAlfa().getMinutos());
			tempAlfaSig = (simulator.getEncoderAlfa().getSigno().equals(-1) ? 0x00 : 0x10);
			
			
			gradUnidDecAlfaInt = tempAlfaGra & 0x00FF;
			gradCenSignAlfaInt = ((tempAlfaGra & 0xFF00) >> 8) | (tempAlfaSig);
			
			
			//segDeltaInt = Integer.parseInt(simulator.getTextDeltaSeg().getText(),16);   // ARREGLAR OJO AQUI QUE A VECES PRODUCE EXCEPCION
			//minDeltaInt = Integer.parseInt(simulator.getTextDeltaMin().getText(),16);
			
			//tempDeltaGra = Integer.parseInt(simulator.getTextDeltaGrad().getText(),16);
			tempDeltaGra = Funciones.int2bcd(simulator.getEncoderDelta().getGrados());
			segDeltaInt  = Funciones.int2bcd(simulator.getEncoderDelta().getSegundos());
		    minDeltaInt  = Funciones.int2bcd(simulator.getEncoderDelta().getMinutos());
			tempDeltaSig = (simulator.getEncoderDelta().getSigno().equals(-1) ? 0x00 : 0x10);
			//System.out.println(minDeltaInt);
			//tempDeltaSig = (simulator.getTextDeltaSign().getText().isEmpty()) ? 0x10 : 0x00; // ARREGLAR - HACE QUE SALTE A VECES
			/*if(simulator.getTextDeltaSign().getText().equals("-"))
			{
				tempDeltaSig = 0x00;
				
			}
			else if(simulator.getTextDeltaSign().getText().equals(" "))
			{
				tempDeltaSig = 0x10;
				
			}
			else
			{
				tempDeltaSig = 0xFF;  // esto seria un error.
			}*/
			//tempDeltaSig = (simulator.getTextDeltaSign().getText().equals("-")) ? 0x00 : 0x10;
			
			//Funciones.log(Level.INFO, "Delta deltasig: " + tempDeltaSig);
			//Funciones.log(Level.INFO, "Signo: " + simulator.getEncoderDelta().getSigno());
			
			gradUnidDecDeltaInt = tempDeltaGra & 0x00FF;
			gradCenSignDeltaInt = ((tempDeltaGra & 0xFF00) >> 8) | (tempDeltaSig);
			
			
			//Funciones.log(Level.INFO, "Delta gradUnidDecDeltaInt: " + gradUnidDecDeltaInt);
			//Funciones.log(Level.INFO, "Delta gradCenSignDeltaInt: " + gradCenSignDeltaInt);
			//Funciones.log(Level.INFO, "Delta minDeltaInt: " + minDeltaInt);
			//Funciones.log(Level.INFO, "Delta segDeltaInt: " + segDeltaInt);
			
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.ALFA).setearBits(EncoderRango.BCD_SEGUNDOS, segAlfaInt );
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.ALFA).setearBits(EncoderRango.BCD_MINUTOS, minAlfaInt);
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.ALFA).setearBits(EncoderRango.BCD_DEC_GRAD, gradUnidDecAlfaInt);
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.ALFA).setearBits(EncoderRango.BCD_CENT_GRAD, gradCenSignAlfaInt);
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.ALFA).decodificarBits();
			
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.DELTA).setearBits(EncoderRango.BCD_SEGUNDOS, segDeltaInt );
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.DELTA).setearBits(EncoderRango.BCD_MINUTOS, minDeltaInt);
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.DELTA).setearBits(EncoderRango.BCD_DEC_GRAD, gradUnidDecDeltaInt);
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.DELTA).setearBits(EncoderRango.BCD_CENT_GRAD, gradCenSignDeltaInt);
			this.simulator.getScoba().getLecturas().getEncoder(EncoderNombre.DELTA).decodificarBits();
			
			
		} catch (NumberFormatException e1)
		{
			// TODO Auto-generated catch block
			//e1.printStackTrace();
			//Funciones.log(Level.SEVERE, e1.getMessage());
		}
		//segAlfa = segAlfaInt.toString();
		//System.out.println(segAlfaInt);
		
		
		
		
		try {
			this.simulator.getScoba().getLecturas().getSensores().put(Sensor.CUPULA, Integer.parseInt(simulator.getTextCupula10b().getText(),10));
			this.simulator.getScoba().getLecturas().getSensores().put(Sensor.PLATAF_AR_AB, Integer.parseInt(simulator.getTextPlatARAB().getText(),10));
			this.simulator.getScoba().getLecturas().getSensores().put(Sensor.PLATAF_AD_AF, Integer.parseInt(simulator.getTextPlatADAF().getText(),10));
			this.simulator.getScoba().getLecturas().getSensores().put(Sensor.TEMP_ESPEJO, Integer.parseInt(simulator.getTextTempEspejo().getText(),10));
			this.simulator.getScoba().getLecturas().getSensores().put(Sensor.TEMP_EXTERIOR, Integer.parseInt(simulator.getTextTempExt().getText(),10));
			this.simulator.getScoba().getLecturas().getSensores().put(Sensor.FUNCIONAMIENTO, Integer.parseInt(simulator.getTextFunc().getText(),10));
			
		} catch (NumberFormatException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
			Funciones.log(Level.SEVERE, e1.getMessage());
		}
		/*try
		{
			latches.getSens().setElementAt(segAlfaInt, 0);
			latches.getSens().setElementAt(minAlfaInt, 1);
			latches.getSens().setElementAt(gradUnidDecAlfaInt, 2);
			latches.getSens().setElementAt(gradCenSignAlfaInt, 3);
			latches.getSens().setElementAt(segDeltaInt, 4);
			latches.getSens().setElementAt(minDeltaInt, 5);
			latches.getSens().setElementAt(gradUnidDecDeltaInt, 6);
			latches.getSens().setElementAt(gradCenSignDeltaInt, 7);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextFunc().getText(),10), 9);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextFines().getText(),10), 10);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getText2lsb().getText(),10), 11);
			latches.getSens().setElementAt((Integer.parseInt(simulator.getTextTempExt().getText(),10)) &0xFF, 12);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextTempEspejo().getText(),10), 13);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextPlatARAB().getText(),10), 14);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextPlatADAF().getText(),10), 15);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextCupula().getText(),10), 16);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextEspecX().getText(),10), 17);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextEspecY().getText(),10), 18);
			latches.getSens().setElementAt(Integer.parseInt(simulator.getTextEspecRed().getText(),10), 19);
			
			//System.out.println(latches.getSens().get(14));
			
		} catch (NumberFormatException e1)
		{
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
			*/
		
		try
		{
			Thread.sleep(5);
		} catch (InterruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		}
		
	}
}
